//<<<+++OPENSOURCE
//<<<+++OPENSOURCE_LICENSE
//<<<+++OPENSOURCE_MUST_BEGIN
#ifndef _REFLOW_ENGINE_H
#define _REFLOW_ENGINE_H
//<<<+++OPENSOURCE_MUST_END

//<<<+++OPENSOURCE_BEGIN LIC==FOXIT
#include "../fpdfemb/fpdfemb.h"
//<<<+++OPENSOURCE_END
#include "../fpdfapi/fpdf_render.h"
#include "../fpdftext/fpdf_text.h"
#include "fpdf_layout.h"
#include "../fpdfapi/fpdf_pageobj.h"
#include "../fpdfdoc/fpdf_tagged.h"

//<<<+++OPENSOURCE_BEGIN LIC==FOXIT 
#define _REFLOW_RENDER_IMPLNEW_  
//<<<+++OPENSOURCE_END

/** Reflow engine for tagged PDF */
/** Reflow page data structure. All displayable page objects are arranged in lines. */

class IPDF_ReflowedPage
{
public:
	static IPDF_ReflowedPage* Create();
	/** Application must call destructor to release memory occupied by the reflowed page. */
	virtual ~IPDF_ReflowedPage() {}

	virtual CFX_PrivateData*	GetPrivateDataCtrl() =0;
		
	/** Get reflowed page height (in pixels) */
	virtual void		GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix) = 0;

	virtual FX_FLOAT	GetPageHeight() = 0;
	virtual FX_FLOAT	GetPageWidth() = 0;

	virtual void		FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str) = 0;
	virtual FX_BOOL		FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y) = 0;

};

typedef struct _RF_ParseStyle
{
	_RF_ParseStyle(){m_LineSpace =0;};

	FX_FLOAT m_LineSpace;

}RF_ParseStyle;

class IPDF_ProgressiveReflowPageParser
{
public:	
	static IPDF_ProgressiveReflowPageParser* Create();
	static FX_BOOL	IsTaggedPage(CPDF_PageObjects*pPage);

	
	virtual ~IPDF_ProgressiveReflowPageParser() {}
	typedef enum { Ready, ToBeContinued, Done, Failed } ParseStatus;
	
	virtual ParseStatus		GetStatus() = 0;

	virtual void			SetParserStyle(RF_ParseStyle style) = 0;
	virtual void			Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags) = 0;

	virtual void			Continue(IFX_Pause* pPause)=0;
	
	virtual int				GetPosition() = 0;
	
	/** Get ready for next reflow */
	virtual void			Clear()=0;
};
 
class IPDF_ProgressiveReflowPageRender
{
public:	
	static IPDF_ProgressiveReflowPageRender* Create();
	

	virtual ~IPDF_ProgressiveReflowPageRender() {}
	typedef enum { Ready, ToBeContinued, Waiting, Done, Failed } RenderStatus;
	
	virtual RenderStatus	GetStatus() = 0;
	
	/** Display a reflowed page onto a device. Set the page origin at specified left/top position 
		(in device coords). Left/top can be negative.
		This function should check the clipbox in the device and only display visible portion of
		the reflowed page.
	*/
 	virtual void		Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits )=0;
	virtual void		Continue(IFX_Pause* pPause) = 0;
	virtual int			GetPosition() = 0;
	
	/** Get ready for next reflow */
	virtual void				Clear()=0;
};

 IPDF_ReflowedPage* Create_ReflowPage();
 IPDF_ProgressiveReflowPageParser* Create_ReflowPageParser();
 IPDF_ProgressiveReflowPageRender* Create_ReflowPageRender();

 //<<<+++OPENSOURCE_MUST_BEGIN
#endif
 //<<<+++OPENSOURCE_MUST_END
